package com.exampleyyy.demoyyy.controller;

import com.aliyuncs.AcsResponse;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.profile.DefaultProfile;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.exampleyyy.demoyyy.JieKouService.UserServiceJieKou;
import com.exampleyyy.demoyyy.SHITIYYY.User;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.exampleyyy.demoyyy.common.R;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.Map;
import java.util.Random;

@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {
    // 1. 普通类
    // 2. @RestController添加装饰器(注解),变成控制器类
    // 3. @RequestMapping捕捉主路由是 /user的请求
    // 4. @Slf4j添加日志记录
    // 装配用户服务层接口
    @Autowired
    private  UserServiceJieKou    fuwuuserjiekou;

    // 5. 捕捉 "/sendMsg" 子路由
    @PostMapping("/sendMsg")
    public R<Object> sendMsg(@RequestBody User user, HttpSession session){
        // {"phone":"18311391491"}
        // 1.@RequestBody设置参数,接收手机号 将json数据赋值给User实体类对象 user
        // 参数2. session会话，用来存储手机号和验证码
        log.info("获取前端的手机号是"+user.getPhone());
        // 2.调用阿里云短信服务API接口代码,发送一条短信
        DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou",
                "LTAI5tGyK3DLgQVMG4invvxu", "ahiOs7DKbISSobWmgn28IKP6Kmuz0j");
        // 设置阿里云个人账号信息,参数1,cn-hangzhou 杭州平台,默认,不需要修改,
         //  一腚 要用自己的 阿里云的 AccessKey
        // 参数2,AccessKeyId：您的AccessKey ID。 账号ID,需要修改
        // 参数3,您的AccessKey Secret  账号密码,需要修改
        IAcsClient client = new DefaultAcsClient(profile);
        // 实例化客户端对象
        SendSmsRequest request = new SendSmsRequest();
        // 实例化请求对象
        request.setSysRegionId("cn-hangzhou");
        // 设置阿里云地址,杭州,默认
        request.setPhoneNumbers(user.getPhone());
        // 设置要发送的手机号
        request.setSignName("刘乐");
        // 设置短信签名名称
        request.setTemplateCode("SMS_472250147");
        // 设置阿里云模板编号
        // 3.生成随机验证码
        Integer param = null;
        param = new Random().nextInt(999999);//生成随机数，最大为999999
        if(param < 100000){
            param = param + 100000;//保证随机数为6位数字
        }
        log.info("生成的随机码是"+param);
        request.setTemplateParam("{\"code\":\""+param+"\"}");
        // 设置随机验证码到短信模板中
        session.setAttribute(user.getPhone(),param);
        // SESSION存储手机号和对应的验证码，验证码和手机号，存成一对
       //{"18311391491":"184637"}
        try {
            AcsResponse res = client.getAcsResponse(request);
            // 发送短信
            log.info("短信发送成功");
        }catch (Exception e) {
            System.out.println("错误是"+e);
            R.error(0,"短信发送失败",null);
        };
        return R.success(1,"短信发送成功",null);
    };
    // 用户登录函数
    @PostMapping("/login")
    public  R<Object> login(@RequestBody Map QianDuanMa,HttpSession session ){
        // 参数1  使用 普通的键值 Map数据类型 对接收前端数据
        // 参数2  后台存到session中的那套手机号和验证码
        // 拿到前端带来的手机号和验证码
        String  QDphone =  QianDuanMa.get("phone").toString();
        String  QDcode = QianDuanMa.get("code").toString();
        log.info("前端码是"+QDcode);// 拿到后台存储的那套手机号和验证码,比对
        Object HTcode = session.getAttribute(QDphone);
        log.info("后端码是"+HTcode.toString());
        if(HTcode.toString().equals(QDcode)){
            // 代码重构,在保存到数据库之前,查询数据库,这个手机号是否存在
            // 1. 创建查询对象
            LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
            lambdaQueryWrapper.eq(User::getPhone,QDphone); // QDphone = 18311391491
            User  user =  fuwuuserjiekou.getOne(lambdaQueryWrapper);
            if(user!=null){// 如果user不等于null,说明数据表没有18311391491
                session.setAttribute("用户信息id",user.getId());
                return  R.success(1,"验证码验证成功,可以登录",null);
            }else{
                // equals 判断是否相同
                log.info("验证码比对成功");
                // 将这个用户存储到数据库 用户表
                user = new User();
                user.setPhone(QDphone);
                user.setStatus(1);
                user.setName("林黛玉大闹野猪林");
                user.setAvatar("默认头像");
                // 调用用户服务层接口,存储到数据库
                // 自动装配 用户服务层接口
                fuwuuserjiekou.save(user);//相当于执行了插入SQL语句 insert into user values (....)
                // 如果验证码验证成功,存储这个用户的 id 为 session
                session.setAttribute("用户信息id",user.getId());
                return  R.success(1,"验证码验证成功,可以登录",null);
            }

        }else{
            // 如果不一致,验证码输入错误
            return  R.error(0,"验证码错误,请重新输入",null);
        }
    }

    // 退出函数
    @PostMapping("/loginout") // 推出接口
    public  R<Object> logout(HttpServletRequest request){
        System.out.println("进入到退出函数了,我打印了");
        // 清除session
        request.getSession().removeAttribute("用户信息id");
        return  R.success(1,"退出成功",null);
    }
}